import logging
import streamlit as st
from typing import Dict, Type, Callable

class ErrorHandler:
    """错误处理器"""
    def __init__(self):
        self.logger = logging.getLogger(__name__)
        self.error_messages: Dict[Type[Exception], str] = {
            ConnectionError: "连接失败，请检查网络连接",
            TimeoutError: "请求超时，请稍后重试",
            ValueError: "输入值无效",
            KeyError: "配置错误",
            Exception: "发生未知错误"
        }
        
    def handle_error(self, error: Exception) -> None:
        """处理错误"""
        # 记录错误日志
        self.logger.error(f"Error: {str(error)}", exc_info=True)
        
        # 获取错误消息
        error_type = type(error)
        message = self.error_messages.get(error_type, self.error_messages[Exception])
        
        # 显示错误消息
        st.error(f"{message}: {str(error)}")
    
    def add_error_handler(self, error_type: Type[Exception], message: str) -> None:
        """添加自定义错误处理"""
        self.error_messages[error_type] = message
    
    def _handle_connection_error(self, error: ConnectionError) -> None:
        """处理连接错误"""
        st.error("连接失败，请检查：\n1. 服务器是否运行\n2. 网络连接是否正常")
        self.logger.error(f"Connection error: {str(error)}")
    
    def _handle_timeout_error(self, error: TimeoutError) -> None:
        """处理超时错误"""
        st.error("请求超时，请稍后重试")
        self.logger.error(f"Timeout error: {str(error)}")
    
    def _handle_value_error(self, error: ValueError) -> None:
        """处理值错误"""
        st.error(f"输入值无效: {str(error)}")
        self.logger.error(f"Value error: {str(error)}")
    
    def _handle_key_error(self, error: KeyError) -> None:
        """处理键错误"""
        st.error(f"配置错误: {str(error)}")
        self.logger.error(f"Key error: {str(error)}") 